package Pojo;

import java.util.List;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

/** Classe Turma
 * Classe que representa uma dada turma de uma disciplina lecionada por um professor. 
 * A turma está relacionada com Professor, Alunos e Disciplina.
 * @author Maione José
 *
 */
@Entity
public class Turma implements Serializable{
	/** Código da Turma*/
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;
	
	/** Ano da Turma*/
	private int ano;
	
	/** Período da Turma*/
	private int periodo;
	
	/** Local da Turma
         * (Nome da variável teve que ser mudado do TP1, pois local é uma 
         * palavra reservada no sql)
         */
	private String localizacao;
	
	/** Horário da Turma*/
	private String horario;
	
	/** Número de Vagas da Turma*/
	private int numeroDeVagas;
	
	/** Verificação se uma turma já foi finalizada ou não*/
	private boolean finalizada;
	
        /** Professor que leciona Turma*/
        @JoinColumn(name="PROFESSOR_ID",referencedColumnName="ID")
        @ManyToOne
	private Professor professor;
	
	/** Disciplina oferecida na Turma*/
        @JoinColumn(name="DISCIPLINA_ID",referencedColumnName="ID")
        @ManyToOne
	private Disciplina disciplina;
	
	/** Lista de Históricos Turma*/
        @OneToMany(mappedBy="turma")
	private List<HistoricoTurma> historicoturmas;
	
	/** Lista de Atividades da Turma lançadas pelo professor*/
        @OneToMany(mappedBy="turma")
	private List<Atividade> atividades;
	
        /**
         * Construtor exigido pelas annotations
         */
	public Turma(){
            
        }
        
        /**
	 * Construtor da Turma sem relacionamentos sem id
	 * @param ano
	 * @param periodo
	 * @param local
	 * @param horario
	 * @param numeroDeVagas
	 * @param finalizada
	 */
	public Turma(int id, int ano, int periodo, String local, 
                String horario, int numeroDeVagas,boolean finalizada){
                this.setId(id);
		this.setAno(ano);
		this.setPeriodo(periodo);
		this.setLocalizacao(local);
		this.setHorario(horario);
		this.setNumeroDeVagas(numeroDeVagas);
		this.setFinalizada(finalizada);
	}
        
        /**
	 * Construtor da Turma sem relacionamentos sem id
	 * @param ano
	 * @param periodo
	 * @param local
	 * @param horario
	 * @param numeroDeVagas
	 * @param finalizada
	 */
	public Turma(int ano, int periodo, String local, 
                String horario, int numeroDeVagas,boolean finalizada){
		this.setAno(ano);
		this.setPeriodo(periodo);
		this.setLocalizacao(local);
		this.setHorario(horario);
		this.setNumeroDeVagas(numeroDeVagas);
		this.setFinalizada(finalizada);
	}

        /**
         * Construtor com o Professor e Disciplina sem id
         * @param ano
         * @param periodo
         * @param local
         * @param horario
         * @param numeroDeVagas
         * @param finalizada
         * @param professor
         * @param disciplina 
         */
        public Turma(int ano, int periodo, String local, String horario, 
                     int numeroDeVagas,boolean finalizada,Professor professor,
                     Disciplina disciplina){
                this.setAno(ano);
		this.setPeriodo(periodo);
		this.setLocalizacao(local);
		this.setHorario(horario);
		this.setNumeroDeVagas(numeroDeVagas);
		this.setFinalizada(finalizada);
                this.setDisciplina(disciplina);
                this.setProfessor(professor);
        }
        
        /**
         * Construtor com o Professor e Disciplina com id
         * @param id
         * @param ano
         * @param periodo
         * @param local
         * @param horario
         * @param numeroDeVagas
         * @param finalizada
         * @param professor
         * @param disciplina 
         */
        public Turma(int id, int ano, int periodo, String local, String horario, 
                     int numeroDeVagas,boolean finalizada,Professor professor,
                     Disciplina disciplina){
                this.setId(id);
                this.setAno(ano);
		this.setPeriodo(periodo);
		this.setLocalizacao(local);
		this.setHorario(horario);
		this.setNumeroDeVagas(numeroDeVagas);
		this.setFinalizada(finalizada);
                this.setDisciplina(disciplina);
                this.setProfessor(professor);
        }        
        
        /**
	 * Construtor da Turma com relacionamentos sem id
	 * @param ano
	 * @param periodo
	 * @param local
	 * @param horario
	 * @param numeroDeVagas
	 * @param finalizada
	 */
	public Turma(int ano, int periodo, String local, String horario, 
                     int numeroDeVagas,boolean finalizada,Professor professor,
                     Disciplina disciplina,List<HistoricoTurma> historicoturmas,
                     List<Atividade> atividades){
		this.setAno(ano);
		this.setPeriodo(periodo);
		this.setLocalizacao(local);
		this.setHorario(horario);
		this.setNumeroDeVagas(numeroDeVagas);
		this.setFinalizada(finalizada);
                this.setDisciplina(disciplina);
                this.setProfessor(professor);
                this.setHistoricoturmas(historicoturmas);
                this.setAtividades(atividades);
	}
        
	/**
	 * Getter do id
	 * @return Código da Turma
	 */
	public int getId() {
		return id;
	}

	/**
	 * Setter do id
	 * @param id
	 */
	private void setId(int id) {
		this.id = id;
	}

	/**
	 * Getter do Ano
	 * @return Ano de oferecimento da Turma
	 */
	public int getAno() {
		return ano;
	}

	/**
	 * Setter do Ano
	 * @param ano
	 */
	private void setAno(int ano) {
		this.ano = ano;
	}
	
	/**
	 * Getter do Período
	 * @return Período no qual a Turma é oferecida
	 */
	public int getPeriodo() {
		return periodo;
	}

	/**
	 * Setter do Período
	 * @param periodo
	 */
	private void setPeriodo(int periodo) {
		this.periodo = periodo;
	}

	/**
	 * Getter do Local da Turma
	 * @return Local onde a turma é oferecida
	 */
	public String getLocalizacao() {
		return localizacao;
	}

	/**
	 * Setter do Local
	 * @param local
	 */
	private void setLocalizacao(String local) {
		this.localizacao = local;
	}

	/**
	 * Getter do Horário
	 * @return Horário da Turma
	 */
	public String getHorario() {
		return horario;
	}

	/**
	 * Setter do Horário
	 * @param horario
	 */
	private void setHorario(String horario) {
		this.horario = horario;
	}

	/**
	 * Getter do Número de Vagas
	 * @return Número de vagas disponíveis para a Turma 
	 */
	public int getNumeroDeVagas() {
		return numeroDeVagas;
	}

	/**
	 * Setter do Número de Vagas
	 * @param numeroDeVagas
	 */
	private void setNumeroDeVagas(int numeroDeVagas) {
		this.numeroDeVagas = numeroDeVagas;
	}
	
	/**
	 * Getter do atributo Finalizada que verifica se a turma já foi finalizada ou não
	 * @return Valor booleano indicando a finalização ou não da turma. 
	 */
	public boolean getFinalizada(){
		return(this.finalizada);
	}
	
	/**
	 * Setter do atributo Finalizada que verifica se a turma já foi finalizada ou não
	 * @param finalizada
	 */
	public void setFinalizada(boolean finalizada){
		this.finalizada = finalizada;
	}
		
	/**
	 * Getter do Professor
	 * @return Professor da Turma
	 */
	public Professor getProfessor() {
		return professor;
	}

	/**
	 * Setter do Professor
	 * @param professor
	 */
	private void setProfessor(Professor professor) {
		this.professor = professor;
	}

	/**
	 * Getter da Disciplina da Turma
	 * @return Disciplina referente aquela turma
	 */
	public Disciplina getDisciplina() {
		return disciplina;
	}

	/**
	 * Setter da Disciplina
	 * @param disciplina
	 */
	private void setDisciplina(Disciplina disciplina) {
		this.disciplina = disciplina;
	}

        /**
         * Getter de HistoricoTurma
         * @return 
         */
        public List<HistoricoTurma> getHistoricoturmas() {
            return historicoturmas;
        }

        /**
         * Setter de Histórico Turmas
         * @param historicoturmas 
         */
        private void setHistoricoturmas(List<HistoricoTurma> historicoturmas) {
            this.historicoturmas = historicoturmas;
        }

        /**
         * Getter de Atividades
         * @return 
         */
        public List<Atividade> getAtividades() {
            return atividades;
        }

        /**
         * Setter de atividades
         * @param atividades 
         */
        private void setAtividades(List<Atividade> atividades) {
            this.atividades = atividades;
        }
        
	/**
	 * Sobrescrita do método toString
	 */
	@Override
	public String toString(){
		return(this.getId()+"\t"+this.getAno()+"\t"+this.getPeriodo()+"\t"+this.getLocalizacao()+"\t"+this.getHorario()+"\t"+this.getNumeroDeVagas()+"\t"+this.getFinalizada()+"\t"+this.getProfessor().getId()+"\t"+getDisciplina().getId()+"\n");
	}
}